package com.ntschy.sys.service;

import com.ntschy.common.core.TreeSelect;
import com.ntschy.common.core.entity.dataobject.SysMenu;
import com.ntschy.common.core.entity.vo.RouterVo;

import java.util.List;
import java.util.Set;

public interface ISysMenuService {

    // * ================================================基础增删改查BEGIN============================================= *

    /**
     * 获取菜单列表
     * 当前查询条件：菜单名称 | 隐藏显示
     * @param menu 菜单对象
     * @return 菜单列表
     */
    List<SysMenu> pageMenu(SysMenu menu);

    /**
     * 根据菜单ID获取菜单详情
     * @param menuId 菜单ID
     * @return 菜单
     */
    SysMenu fetchMenu(String menuId);

    /**
     * 新增菜单
     * @param menu 菜单对象
     * @return 新增结果
     */
    int addMenu(SysMenu menu);

    /**
     * 根据id更新菜单
     * @param menu 菜单对象
     * @return 更新结果
     */
    int updateMenu(SysMenu menu);

    /**
     * 根据菜单ID删除菜单
     * @param menuId 菜单ID
     * @return 删除结果
     */
    int deleteMenu(String menuId);
    // * =================================================基础增删改查END============================================== *

    /**
     * 根据用户id获取菜单权限标示
     * @param userId 用户id
     * @return 标示集合
     */
    Set<String>  listMenuPermsByUserId(String userId);

    /**
     * 根据角色id查询角色所拥有菜单id
     * 角色详情用
     * @param roleId 角色id
     * @param menuCheckStrictly 菜单是否集联
     * @return 菜单id集合
     */
    List<String> listMenuIdByRoleId(String roleId);

    /**
     * 根据用户ID查询菜单树信息
     *
     * @param userId 用户ID
     * @return 菜单列表
     */
    List<SysMenu> listMenuTreeByUserId(String userId);

    /**
     * 构建前端路由所需要的菜单
     *
     * @param menus 菜单列表
     * @return 路由列表
     */
    List<RouterVo> buildMenus(List<SysMenu> menus);

    /**
     * 构建前端所需要树结构
     * 角色详情用
     * @param menus 菜单列表
     * @return 树结构列表
     */
    List<SysMenu> buildMenuTree(List<SysMenu> menus);

    /**
     * 构建前端所需要下拉树结构
     * 角色详情用
     * @param menus 菜单列表
     * @return 下拉树结构列表
     */
    public List<TreeSelect> buildMenuTreeSelect(List<SysMenu> menus);

    /**
     * 校验菜单名称是否存在
     * @param roleName 角色名称
     * @return 校验结果
     */
    boolean checkMenuNameExist(String menuName);

    /**
     * 校验是否存在子菜单
     * @param menuId 菜单ID
     * @return 校验结果
     */
    boolean checkHasChildMenu(String menuId);

    /**
     * 校验菜单是否已分配
     * @param menuId 菜单ID
     * @return 校验结果
     */
    boolean checkMenuExistRole(String menuId);

}
